/**
 * File: ILS.h
 *
 * Integrantes:
 * @author	Jormar Arellano		(05-37840) <jormar.arellano@gmail.com>
 * @author	Sabrina Fernández	(05-38163) <sabrinamfm@gmail.com>
 */

#ifndef ILS_H
#define	ILS_H

#include "graph.h"

#ifdef	__cplusplus
extern "C" {
#endif

/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Parametros del algoritmo
 * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/** 
 * Numero de iteraciones que realiza LS 
 */
long ils_iter;

/** 
 * Imprime informacion verbose 
 */
int ils_verbose;

/** 
 * Funcion de perturbacion para una solucion del problema 
 */
Graph *(*ils_disturb)(Graph* graph);

/** 
 * Funcion de aceptacion un par de instancias del problema 
 */
Graph *(*ils_acceptance)(Graph*, Graph *, int *);

/**
 * Inicializa las constantes con valores por defecto.
 */
void ils_defaults();

/**
 * Perturba una solucion actual.
 * @param	graph	Grafo al cual se le aplicara la perturbacion.
 * @return	Un nuevo grafo perturbado.
 */
Graph *disturb_randomRecoloring(Graph* graph);

/** 
 * Numero de colores que se recolorean al azar 
 */
int ils_recoloring_k;

/**
 * Este criterio de aceptacion elige el grafo cuya solucion sea factible y ademas tenga 
 * la coloracion mas pequena. Si ambos tienen la misma coloracion, escoge uno al azar.
 * IMPORTANTE: Se asume que g1 ES FACTIBLE, y g2 una solucion nueva, posiblemente no factible.
 *
 * @param	g1		Grafo al que se le aplicara el criterio de aceptacion (que si es factible)
 * @param	g2		Grafo al que se le aplicara el criterio de aceptacion.
 * @param	count	Contador actual.
 */
Graph *acceptance_thebest(Graph* g1, Graph *g2, int *count);

/**
 * Aplica el algoritmo de busqueda local iterativa al grafo.
 */
Graph *ils(Graph *graph);

#ifdef	__cplusplus
}
#endif

#endif
